/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
package DBMS;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import ve.usb.*;
import clases.*;
        

/**
 *
 * @author miguel
 * @version 6.2
 */
public class DataBaseManager {
    private static String driver="org.postgresql.Driver";
    private static String cadenacon="jdbc:postgresql://localhost:5432/deport_dide";
    private static String userPostgres="postgres";
    private static String passPostgres="postgres";
    private static Connection cn;
    private static DataBaseManager instance  = null;
    
    private DataBaseManager(){
    }
    
    static public DataBaseManager getInstance(){
        if (null ==  DataBaseManager.instance){
               DataBaseManager.instance = new DataBaseManager();
        }
        boolean a =getConexion();
        System.out.println(a);
        return DataBaseManager.instance;
    }
    
    public static boolean getConexion(){
        
//        System.out.println(driver);
        try{
            Class.forName(driver);
            cn=DriverManager.getConnection(cadenacon,userPostgres,passPostgres);
            System.out.println(cn);
            System.out.println("Conexion a la base de datos Ejemplo realizada con exito! ");
            return true;
            
        }
        catch(Exception e){ 
            e.printStackTrace();
            System.out.println("Se ha producido un error en la conexion a la base de datos Ejemplo! ");
           
        }
        return false;
    }
    
    public void cierraConexion(Connection cn){
        try{
            DataBaseManager.cn.close();
            cn = null;
        }
        catch(SQLException e){
            e.printStackTrace();
        }
    }

    // Gestionar Deportista
    public boolean registrarDeportista(RegistroDeportistaForm rf) {
        //genera la instruccion SQL de insercion a partir
        //de los datos almacenados en el JavaBean Usuario
        Connection c = DataBaseManager.cn;
        int n = 0;
        int id = 0;
        try{
            Statement stmt = c.createStatement();
            String queryA = "INSERT into deportista (ci_deportista, fecha_nacimiento, cod_carrera, celular)";
            queryA+="values('"+rf.getCi()+
                    "','"+rf.getFnac()+
                    "','"+rf.getCodCarrera()+
                    "','"+rf.getCelular() +"')";

            n = stmt.executeUpdate(queryA);
        }
        catch(Exception e){
            System.out.println("Error en sql en Agregar Deportista");
            e.printStackTrace();
        }
        return n > 0;
   
    }
    
    public ArrayList<RegistroDeportistaForm> getInfoDeportistas() {
        ArrayList<RegistroDeportistaForm> deps = new ArrayList<RegistroDeportistaForm>();
        try{
            
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            String query = "SELECT * FROM deportista join usuario on (ci_deportista =ci) ";
            ResultSet rs = st.executeQuery(query);
            while( rs.next() ){
                RegistroDeportistaForm dep = new RegistroDeportistaForm();               
                dep.setId(rs.getInt("id"));
                dep.setNombre(rs.getString("nombres")+" "+rs.getString("Apellidos"));
                dep.setCi(rs.getString("ci"));
                dep.setUsbid(rs.getString("usbid"));
                dep.setFnac(rs.getString("fecha_nacimiento"));
                dep.setCodCarrera(rs.getString("cod_carrera"));
                dep.setCelular(rs.getString("celular"));
                deps.add(dep);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            return deps;
        }
    }
    
    public RegistroDeportistaForm llenarDeportista(CamposDeportista cd){
        RegistroDeportistaForm d = new RegistroDeportistaForm();
        try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            String query = "SELECT * FROM deportista WHERE id = '"+cd.getId()+"'";
            ResultSet rs = st.executeQuery(query);
            while( rs.next() ){
                d.setCi(rs.getString("ci_deportista"));
                d.setFnac(rs.getString("fecha_nacimiento"));
                d.setCodCarrera(rs.getString("cod_carrera"));
                d.setCelular(rs.getString("celular"));
            }
        }catch(Exception e){
            System.err.println("Error en llenar");
            e.printStackTrace();
        }finally{
            return d;
        }        
    }
    
    public void modificarDeportista(RegistroDeportistaForm d, int id){
        String query = "UPDATE deportista ";
        query += " SET ci_deportista = '" +d.getCi()+"',";
        query += " fecha_nacimiento = '" +d.getFnac()+"', ";
        query += " cod_carrera = '" +d.getCodCarrera()+"', ";
        query += " celular = '" +d.getCelular()+"'";
        query += " WHERE id = '"+id+"'";
        try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            st.execute(query);
        } catch (SQLException e) {
            System.out.println("Error en modificar deportista");
            e.printStackTrace();
        }
    }
    
    public boolean verificarAsociado(CamposDeportista d) {
        String query = "SELECT * from disciplina_deportista join deportista on (deportista.ci_deportista = disciplina_deportista.ci_deportista)";
        query += "WHERE deportista.id ='" + d.getId() + "'";
        boolean esta = false;
        try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            ResultSet rs = st.executeQuery(query);
            if (rs.next()) {
                esta = true;
            }
        } catch (SQLException e) {
            System.out.println("Error en verificar deportista");
            e.printStackTrace();
        }finally{
            return esta;
        } 
         
    }
    
    
    public void eliminarDeportista(CamposDeportista d){
        String query = "DELETE FROM deportista ";
        query += "WHERE id = '" +d.getId()+"'";
         try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            st.execute(query);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Error en Eliminar Deportista");
        }
    }
    
    // Asociar Deportista-Disciplina
    public boolean buscarDeportistaCI(AsociarDepDisForm a){
        Connection c = DataBaseManager.cn;
        boolean esta = false;
        String query   = "Select * from DEPORTISTA where";
        query  += " ci_deportista='"+ a.getDeportista() +"'";
        try {

            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            if (rs.next())
                esta =true;

        } catch (Exception e) {
            System.out.println("Error en buscar deportista");
            e.printStackTrace();
        }
        return esta;
    }
    

    public boolean Asociar(AsociarDepDisForm vf) {
       String cod = "",ci = "";
        Connection c = DataBaseManager.cn;
        System.out.println("DISC: "+vf.getDisciplina());
        System.out.println("Dep: "+vf.getDeportista());
        
          try {
            String query="SELECT codigo FROM disciplina where nombre='"+vf.getDisciplina()+"'";
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                cod = rs.getString("codigo");
                System.out.println("cod"+cod);
            }
         
          String query2="INSERT INTO disciplina_deportista (ci_deportista,codigo)values('"+vf.getDeportista()+"','"+cod+"')";     
          
          stmt = c.createStatement();
          stmt.execute(query2);
        } catch (Exception e) {
            System.out.println("Error en sql asociar");
            e.printStackTrace();
            return false;
        } 
        return true;
    }
   
    
    public ArrayList<String> CargarDeportistas() {
        Connection c = DataBaseManager.cn;
       ArrayList<String> lista = new ArrayList<String>();
        String f ="";
        //Consulta SQL para obtener los datos
        //del usuario indicado
        String query = "SELECT * FROM deportista join usuario on (ci_deportista =ci) ";
        System.out.println(query);
        try {
            
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                f = "";
                f= rs.getString("nombres");
                lista.add(f);
            }
                
        } catch (Exception e) {
            System.out.println("Error en validar");
        } finally {
//            if (estaUsuario) {
//                System.out.println("El QUERY salio bien");
//            }
            return lista;
        }
    }
    
      
    public ArrayList<String> CargarDisciplinasPropias(String entrenador) {
        Connection c = DataBaseManager.cn;
       ArrayList<String> lista = new ArrayList<String>();
        String f ="";
        //Consulta SQL para obtener los datos
        //del usuario indicado
        String  query = "select * from disciplina_entrenador DE join disciplina D on D.codigo = DE.codigo ";
                query+= " where ci_entrenador='"+entrenador+"'";
        System.out.println(query);
        try {
            
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                f = "";
                f= rs.getString("nombre");
                lista.add(f);
            }
                
        } catch (Exception e) {
            System.out.println("Error en validar");
        } finally {
//            if (estaUsuario) {
//                System.out.println("El QUERY salio bien");
//            }
            return lista;
        }
    }
    
    public ArrayList<String> CargarDisciplinasExternas() {
        Connection c = DataBaseManager.cn;
       ArrayList<String> lista = new ArrayList<String>();
        String f ="";
        //Consulta SQL para obtener los datos
        //del usuario indicado
        String query = "SELECT * from disciplina where propia_usb='false' ";
        System.out.println(query);
        try {
            
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                f = "";
                f= rs.getString("nombre");
                lista.add(f);
            }
                
        } catch (Exception e) {
            System.out.println("Error en validar");
        } finally {
//            if (estaUsuario) {
//                System.out.println("El QUERY salio bien");
//            }
            return lista;
        }
    }
    
    public boolean estaRegistrado(RegistroUsuarioForm vf){
        Connection c = DataBaseManager.cn;
        boolean esta = false;
        String ci=(String) vf.getCi();
        String usbid= (String) vf.getUsbid();
        String  query   = "Select * from usuario where";
                query  += " ci='"+ci+"' AND usbid='"+usbid+"' AND nivel='3'";
        try {
            
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            if (rs.next()){ 
              esta =true;
              vf.setNombres(rs.getString("nombres"));
              vf.setApellidos(rs.getString("apellidos"));
            }
        } catch (Exception e) {
            System.out.println("Error en validar");
        }
       
                    
    
        return esta;
    }
    
    public boolean esta(String vf,InicioSesion i){
        Connection c = DataBaseManager.cn;
        String ci = i.getLogin();
        boolean esta = false;
        String query="";
        System.out.println("vf:"+vf);
        if (vf.equals("director")){
            query   = "Select * from "+vf+" where";
                query  += " ci='"+ci+"'";
        }else{
         query   = "Select * from "+vf+" where";
                query  += " ci_"+vf+"='"+ci+"'";
        }
        try {
            
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            if (rs.next())
              esta =true;
            System.out.println("Valor de esta en: "+vf+" es el valor de esta= "+esta);
        } catch (Exception e) {
            System.out.println("Error en esta");
            e.printStackTrace();
        }
       
                    
    
        return esta;
     }
        
        public boolean estaDeportista(InicioSesion i){
            return esta("deportista",i);
        }
        public boolean estaEntrenador(InicioSesion i){
            
            return esta("entrenador",i);
        }
        public boolean estaDirector(InicioSesion i){
            return esta("director",i);
        }
        
        // Gestionar Horario de Entrenamiento
        public boolean registrarHorario(Horario h){
        String query = "INSERT INTO horario (hora_inicio, hora_fin, cod_horario)";
        query += "values('";
        query += h.getHora_ini();
        query += "','" + h.getHora_fin();
        query += "','" + h.getCod_horario() +"');";
        String query2 = "SELECT cod_horario FROM horario WHERE ";
        query2 += "( hora_inicio = '"+h.getHora_ini();
        query2 += "' and hora_fin = '"+h.getHora_fin();
        query2 += "') or cod_horario = '"+h.getCod_horario()+"';";
        try {
            Connection c = DataBaseManager.cn;
            Statement stmt = c.createStatement();
                        System.out.println(c.toString());
            ResultSet rs = stmt.executeQuery(query2);
            if ( rs.next() ){
                stmt.close();
                c.close();
                return false;
            }
            System.out.println(query);
            stmt.execute(query);
            stmt.close();
            c.close();
            return true;

            
        } catch (SQLException e) {
            System.out.println("Problema con el statement");
            return false;
        }
    }
    
    public ArrayList<Horario> cargarHorario() {
        Horario hors = new Horario();
        ArrayList<Horario> hor = new ArrayList<Horario>();
        try{
            
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            String query = "SELECT * FROM horario "
                    + "ORDER BY hora_inicio;";
            ResultSet rs = st.executeQuery(query);
            while( rs.next() ){
                hors = new Horario();
                hors.setHora_ini(rs.getString("hora_inicio"));
                hors.setHora_fin(rs.getString("hora_fin"));
                hors.setCod_horario(rs.getString("cod_horario"));
                hor.add(hors);
            }
        }catch(Exception e){
            System.out.println("Error en cargar horario");
            e.printStackTrace();
        }finally{
            return hor;
        }
    }
    
    public Horario elegirHorario(EliminarHorario h){
        Horario d = new Horario();
        try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            String query = "SELECT * FROM horario WHERE cod_horario= '"+h.getCod_horario()+"'";
            ResultSet rs = st.executeQuery(query);
            while( rs.next() ){
                d.setHora_ini(rs.getString("hora_inicio"));
                d.setHora_fin(rs.getString("hora_fin"));
                d.setCod_horario(rs.getString("cod_horario"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            return d;
        }        
    }
    
    public void modificarHorario(Horario h){;
        String query = "UPDATE horario ";
        query += " SET hora_inicio = '" +h.getHora_ini()+"',";
        query += " hora_fin = '" +h.getHora_fin()+"' ";
        query += " WHERE cod_horario = '"+h.getCod_horario()+"'";
        try{      
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            st.execute(query);
        } catch (SQLException e) {
            System.out.println("Problema con el statement");
        }
    }
    
    public boolean eliminarHorario(EliminarHorario h){
        String query2 = "SELECT * FROM disc_horario_dias";
        query2 += " WHERE  cod_horario = '" +h.getCod_horario()+"'";
        String query = "DELETE FROM horario ";
        query += "WHERE cod_horario = '" +h.getCod_horario()+"'";
         try{      
            System.out.println(query2);
            Connection c = DataBaseManager.cn;
            Statement st = c.createStatement();
            ResultSet rs = st.executeQuery(query2);
            if ( rs.next() ){
                st.close();
                c.close();
                return false;
            }
            st.execute(query);
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Problema con el statement");
            return false;
        }
    }
    
    // Reporte - Estudiante
    public ArrayList<DisciplinaForm> CargarDisciplinasPropiaUSB() {
        Connection c = DataBaseManager.cn;
        ArrayList<DisciplinaForm> listaD = new ArrayList<DisciplinaForm>();
        String  query = "select * from disciplina where propia_usb = true";
        try {
           
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                DisciplinaForm df = new DisciplinaForm();
                df.setNombre(rs.getString("nombre"));
                df.setDescripcion(rs.getString("descripcion"));
                listaD.add(df);
            }
                
        } catch (Exception e) {
            System.err.println("Error SQL en Cargar Disciplinas propias USB ");
            e.printStackTrace();
        } finally {
            return listaD;
        }
    }
    
    public ArrayList<AsistenciaForm> CargarAsistencia(RgoDeFechasForm vf, String login) {
        Connection c = DataBaseManager.cn;
        // Creacion fecha desde:
        String fechaD = vf.getAnoD()+"-"+vf.getMesD()+"-"+vf.getDiaD(); 
        // Creacion fecha hasta:
        String fechaH =  vf.getAnoH()+"-"+vf.getMesH() + "-"+vf.getDiaH();
        ArrayList<AsistenciaForm> listaD = new ArrayList<AsistenciaForm>();
        String  query = "select * from asistencia where ci_deportista ='"+login+"'";
        query+=" AND fecha>= '"+fechaD+"' AND fecha <= '"+fechaH+"'";
        try {
           System.out.println(query);
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                AsistenciaForm df = new AsistenciaForm();
                df.setFecha(rs.getString("fecha"));
                df.setHora_llegada(rs.getString("hora_llegada"));
                df.setHora_salida(rs.getString("hora_salida"));
                
                listaD.add(df);
            }
                
        } catch (Exception e) {
            System.err.println("Error SQL en Cargar Disciplinas propias USB ");
            e.printStackTrace();
        } finally {
            return listaD;
        }
    }
    
    
        public ArrayList<AsistenciaEntrenadorForm> CargarAsistenciaE(PreListarAsistenciaForm vf, String login) {
        Connection c = DataBaseManager.cn;
        // Creacion fecha desde:
        String fechaD = vf.getAnoD()+"-"+vf.getMesD()+"-"+vf.getDiaD(); 
        // Creacion fecha hasta:
        String fechaH =  vf.getAnoH()+"-"+vf.getMesH() + "-"+vf.getDiaH();
        ArrayList<AsistenciaEntrenadorForm> listaD = new ArrayList<AsistenciaEntrenadorForm>();
        String  query = "select * from asistencia A, usuario U, disciplina_entrenador DE, disciplina d where U.ci=A.ci_deportista and A.codigo =DE.codigo ";
                query+= " and d.codigo=A.codigo AND d.nombre='"+vf.getDisciplina()+"'"; 
                query+=" AND DE.ci_entrenador='" +login+"' ";
        query+=" AND fecha>= '"+fechaD+"' AND fecha <= '"+fechaH+"' "; // Falta la restriccion de que sean solo las disciplinas del entrenadro
        try {
           System.out.println(query);
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                AsistenciaEntrenadorForm df = new AsistenciaEntrenadorForm();
                df.setNombre(rs.getString("nombres")+" "+rs.getString("Apellidos"));
                df.setFecha(rs.getString("fecha"));
                df.setHora_llegada(rs.getString("hora_llegada"));
                df.setHora_salida(rs.getString("hora_salida"));
                
                listaD.add(df);
            }
                
        } catch (Exception e) {
            System.err.println("Error SQL en Cargar Disciplinas propias USB ");
            e.printStackTrace();
        } finally {
            return listaD;
        }
    }
    
    // Reporte - Entrenador
    public ArrayList<RegistroDeportistaForm> ListarDepDis(String disciplina) {
        Connection c = DataBaseManager.cn;
        ArrayList<RegistroDeportistaForm> listaD = new ArrayList<RegistroDeportistaForm>();
        String  query = "select * from disciplina "
                + "join disciplina_deportista on (disciplina.codigo=disciplina_deportista.codigo) "
                + "join usuario on (usuario.ci = disciplina_deportista.ci_deportista)"
                + "where disciplina.nombre ='"+disciplina+"'";;
                
        try {
           
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()){
                RegistroDeportistaForm df = new RegistroDeportistaForm();
                df.setNombre(rs.getString("nombres"));
                df.setCi(rs.getString("ci"));
                df.setUsbid(rs.getString("usbid"));
                listaD.add(df);
            }
                
        } catch (Exception e) {
            System.err.println("Error SQL en Listar deportistas por Disciplina");
            e.printStackTrace();
        } finally {
            return listaD;
        }
    }
    
    
    public ArrayList<InasistenciaForm> cargarInasistencias(busquedaForm b,String login){
        Connection c = DataBaseManager.cn;
        ArrayList<InasistenciaForm> lista = new ArrayList<InasistenciaForm>();
        
        String query = "select ci,nombres,apellidos,disc.nombre "
                + "from usuario join deportista a on ci = a.ci_deportista "
                + "join disciplina_deportista b on a.ci_deportista = b.ci_deportista "
                + "join disciplina c on c.codigo = b.codigo "
                + "join disc_horario_dias d on d.codigo = c.codigo "
                + "join dias_entrenamiento e on e.cod_dias = d.cod_dias "
                + "join disciplina_entrenador f on f.codigo = c.codigo "
                + "join disciplina disc on f.codigo=disc.codigo ";
        String query1 = "EXCEPT "
                + "select ci,nombres,apellidos,p.nombre "
                + "from usuario join deportista a on ci = a.ci_deportista "
                + "join asistencia b on b.ci_deportista = a.ci_deportista "
                + "join disciplina p on p.codigo=b.codigo "
                + "where b.fecha = '"+b.getFecha_formDAno()+"-"+b.getFecha_formDMes()+"-"+b.getFecha_formDDia()+"';";
        String query2 = "select extract(dow from date'"+b.getFecha_formDAno()+"-"+b.getFecha_formDMes()+"-"
                +b.getFecha_formDDia()+"' + interval '1 hour');";
        System.out.println() ;
        System.out.println("Hasta aqui llegue");
        try {
            Statement stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query2);
            rs.next();
            String numdia = rs.getString("date_part");
            if ( "0".equals(numdia)){
                System.out.println("Domingo");
            } else {
                String diasem = "";
                if ("1".equals(numdia)){
                    diasem ="lunes";
                } else if ("2".equals(numdia)) {
                    diasem ="martes";
                } else if ("3".equals(numdia)) {
                    diasem ="miercoles";
                } else if ("4".equals(numdia)) {
                    diasem ="jueves";
                } else if ("5".equals(numdia)) {
                    diasem ="viernes";
                } else {
                    diasem ="sabado";
                }
                query += "where e."+diasem+"=true and f.ci_entrenador = '"+login+"'  ";
                query += query1;
                System.out.println(query);
                rs = stmt.executeQuery(query);
                while (rs.next()){
                    InasistenciaForm df = new InasistenciaForm();
                    df.setCi(rs.getString("ci"));
                    df.setNombres(rs.getString("nombres"));
                    df.setNombre(rs.getString("nombre"));
                    df.setApellidos(rs.getString("apellidos"));
                    lista.add(df);
                }
            }
        } catch (Exception e) {
            System.err.println("Error SQL en Listar inasistencias");
            e.printStackTrace();
        } finally {
            return lista;
        }   
    }
}

